import re
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class BqgsexySpider(CrawlSpider):

    name = "bqgSexy"
    allowed_domains = ["tianyashuku.net"]
    start_urls = ["https://tianyashuku.net/jinyong/"]

    # 定义爬取规则(使用正则表达式定义爬取哪些格式的链接)
    rules = (
        # 规则1：爬取所有/wuxia/数字 形式的链接，继续跟进(follow=True)
        Rule(LinkExtractor(
            allow=r'/wuxia/(68[6-9]|69\d)',  # 只匹配/wuxia/686 到/wuxia/699范围的链接
            # allow=r'/wuxia/68[6-7]',  # 只匹配/wuxia/686 到/wuxia/699范围的链接
            restrict_xpaths='//a[@class="thumbnail"]'  # 只从带有thumbnail类的a标签中提取链接
        ), follow=True),

        # 规则2：在上述链接页面中，爬取所有/wuxia/数字/数字.html形式的章节链接
        Rule(LinkExtractor(
            allow=r'/wuxia/\d+/\d+\.html'  # 匹配/wuxia/686/123.html、/wuxia/699/456.html等
        ), callback='parse_item', follow=False),
    )

    def parse_item(self, response):
        # 小说名
        novel_name = ''.join(response.xpath('//div[@class="container"]/a[2]/text()').getall())

        # 章节链接
        chapter_url = response.url

        # 提取章节号（从URL中提取数字）    https://tianyashuku.net/wuxia/699/18068.html
        # URL格式：https://m.c3719.lol/book/22944/123.html → 提取123
        # 用正则表达式扫描 chapter_url，尝试找到符合 /book/22944/数字.html 规则的内容
        # 找到后会返回一个 “匹配对象”（类似一个结果容器 ），存到 chapter_num_match 里
        # 如果没找到，chapter_num_match 会是 None
        chapter_num_match = re.search(r'/wuxia/\d+/(\d+)\.html', chapter_url)
        if chapter_num_match:
            # group(0) 会返回整个正则匹配到的内容（比如 /book/22944/123.html ）
            # group(1) 会返回第一个捕获组（括号里的内容）匹配到的部分，也就是我们想要的章节号数字（比如 123 ）
            chapter_num = int(chapter_num_match.group(1))  # 转换为整数，方便排序
        else:
            chapter_num = 0  # 异常情况，给默认值

        # 标题
        title = ''.join(response.xpath('//h1/text()').getall()).strip()

        # 内容
        # 爬取到的正文内容，返回的是列表形式，把列表中的正文内容拼接成一段完整的字符串，对内容进行格式化，去掉首位空格
        content_list = response.xpath('//div[@class="m-article-text"]//text()').getall()
        content = ''.join([i.strip() for i in content_list]).replace('金庸Ctrl+D 收藏本站', '')

        # 创建Item的对象
        from doubanScrapy.bqgNovel.bqgNovel.items import BqgnovelItem
        item = BqgnovelItem()
        item['novel_name'] = novel_name
        item['title'] = title
        item['content'] = content
        item['chapter_url'] = chapter_url
        item['chapter_num'] = chapter_num
        yield item
